package com.iszhangsc.backup.util;

import cn.hutool.core.lang.Validator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.support.CronSequenceGenerator;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * CRON 工具类
 * </p>
 *
 * @author zhāngshìchāng
 * @date 2020/12/11 12:11 下午
 */
@Slf4j
public final class CronUtils {

    private CronUtils() {

    }

    /**
     * 通过CRON获取下一次执行时间
     * @param cron CRON表达式
     * @return  Date
     */
    public static Date nextExecTime(String cron) {
        return nextExecTime(cron, 1).get(0);
    }


    /**
     * 通过CRON获取下N次执行时间数组
     * @param cron CRON表达式
     * @param n 获取多少次
     * @return  List
     */
    public static List<Date> nextExecTime(String cron, int n) {
        Validator.validateTrue(isValidExpression(cron), "CRON表达式错误");
        List<Date> result = new ArrayList<>(n);
        CronSequenceGenerator generator = new CronSequenceGenerator(cron);
        Date nextDate = new Date();
        for (int i = 0; i < n; i++) {
            nextDate = generator.next(nextDate);
            result.add(nextDate);
        }
        return result;
    }

    /**
     * 检验表达式是否正确
     *
     * @param cron cron表达式
     * @return 正确:true
     */
    public static boolean isValidExpression(String cron) {
        return CronSequenceGenerator.isValidExpression(cron);
    }


}
